package cn.mygweb.common.utils;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

/** 
* <p>Title: RedisUtils.java</p>
* <p>Description: Redis的工具类
	1.数据库键命名按照 "用户id:模块路径" 的规则命名，中间全部使用冒号分隔
* 	2.查询信息时进行redis缓存添加及读取，
* 	3.增、删、改操作进行redis缓存的删除操作</p>  
* @author gxb 
* @date 2019年5月22日 
* <p>Copyright: Copyright (c) 2019</p>
* <p>Company: www.mygweb.cn</p> 
*/
@Component
public class RedisUtils {

	@Autowired
	private StringRedisTemplate template;
	
	/**
	 * <p>Title: ttl</p>
	 * <p>Description: 命令：TTL key，以秒为单位返回给定key的剩余生存时间（TTL, time to live）</p>
	 * @param key
	 * @return
	 */
	public long ttl(String key) {
		return template.getExpire(key);
	}
	
	/**
	 * <p>Title: expire</p>
	 * <p>Description: 实现命令：expire 设置过期时间，单位秒</p>
	 * @param key
	 * @param timeout
	 */
	public void expire(String key, long timeout) {
		template.expire(key, timeout, TimeUnit.SECONDS);
	}
	
	/**
	 * <p>Title: incr</p>
	 * <p>Description: 实现命令：INCR key，增加key一次</p>
	 * @param key
	 * @param delta
	 * @return
	 */
	public long incr(String key, long delta) {
		return template.opsForValue().increment(key, delta);
	}
	
	/**
	 * <p>Title: keys</p>
	 * <p>Description: 实现命令：KEYS pattern，查找所有符合给定模式 pattern的 key</p>
	 * @param pattern
	 * @return
	 */
	public Set<String> keys(String pattern) {
		return template.keys(pattern);
	}
	
	/**
	 * <p>Title: del</p>
	 * <p>Description: 实现命令：DEL key，删除一个key</p>
	 * @param key
	 */
	public void del(String key) {
		template.delete(key);
	}
	
	/**
	 * <p>Title: set</p>
	 * <p>Description: 实现命令：SET key value，设置一个key-value（将字符串值 value关联到 key）</p>
	 * @param key
	 * @param value
	 */
	public void set(String key, String value) {
		template.opsForValue().set(key, value);
	}
	
	/**
	 * <p>Title: set</p>
	 * <p>Description: 实现命令：SET key value EX seconds，设置key-value和超时时间（秒）</p>
	 * @param key
	 * @param value
	 * @param timeout
	 */
	public void set(String key, String value, long timeout) {
		template.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
	}
	
	/**
	 * <p>Title: get</p>
	 * <p>Description: 实现命令：GET key，返回 key所关联的字符串值。</p>
	 * @param key
	 * @return
	 */
	public String get(String key) {
		return (String)template.opsForValue().get(key);
	}
	
	/**
	 * <p>Title: hset</p>
	 * <p>Description: 实现命令：HSET key field value，将哈希表 key中的域 field的值设为 value</p>
	 * @param key
	 * @param field
	 * @param value
	 */
	public void hset(String key, String field, Object value) {
		template.opsForHash().put(key, field, value);
	}
	
	/**
	 * <p>Title: hget</p>
	 * <p>Description: 实现命令：HGET key field，返回哈希表 key中给定域 field的值</p>
	 * @param key
	 * @param field
	 * @return
	 */
	public String hget(String key, String field) {
		return (String)template.opsForHash().get(key, field);
	}
	
	/**
	 * <p>Title: hdel</p>
	 * <p>Description: 实现命令：HDEL key field [field ...]，删除哈希表 key 中的一个或多个指定域，不存在的域将被忽略。</p>
	 * @param key
	 * @param fields
	 */
	public void hdel(String key, Object... fields) {
		template.opsForHash().delete(key, fields);
	}
	
	/**
	 * <p>Title: hgetall</p>
	 * <p>Description: 实现命令：HGETALL key，返回哈希表 key中，所有的域和值</p>
	 * @param key
	 * @return
	 */
	public Map<Object, Object> hgetall(String key) {
		return template.opsForHash().entries(key);
	}
	
	/**
	 * <p>Title: lpush</p>
	 * <p>Description: 实现命令：LPUSH key value，将一个值 value插入到列表 key的表头</p>
	 * @param key
	 * @param value
	 * @return
	 */
	public long lpush(String key, String value) {
		return template.opsForList().leftPush(key, value);
	}
	
	/**
	 * <p>Title: lpop</p>
	 * <p>Description: 实现命令：LPOP key，移除并返回列表 key的头元素。</p>
	 * @param key
	 * @return
	 */
	public String lpop(String key) {
		return (String)template.opsForList().leftPop(key);
	}
	
	/**
	 * <p>Title: rpush</p>
	 * <p>Description: 实现命令：RPUSH key value，将一个值 value插入到列表 key的表尾(最右边)。</p>
	 * @param key
	 * @param value
	 * @return
	 */
	public long rpush(String key, String value) {
		return template.opsForList().rightPush(key, value);
	}
	
	/**
	 * <p>Title: rpop</p>
	 * <p>Description: 实现命令：RPOP key，移除并返回列表 key的尾元素。</p>
	 * @param key
	 * @return
	 */
	public String rpop(String key) {
		return (String)template.opsForList().rightPop(key);
	}
	
	/**
	 * <p>Title: delAll</p>
	 * <p>Description: 删除所有的缓存</p>
	 */
	public void delAll() {
		Set<String> keys = template.keys("*");
		template.delete(keys);
	}
	
}